﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using CRC.GestionSalones.Controladores;
using CRC.Comun.Presentacion;
using CRC.Inspecciones.Presentacion;

namespace CRC.GestionSalones.Presentacion
{
    public partial class ModificarSalon : FormSalon, EscuchadorDeListado
    {
        protected ControladorModificarSalon cms = new ControladorModificarSalon();
        private int intSalon;

        public ModificarSalon()
        {
            InitializeComponent();
        }

        public ModificarSalon(int pIntSalon) : this()
        {
            this.intSalon = pIntSalon;
            listaAsistentes.Visible = true;

            try
            {

                this.cmbProvincia.SetData(cms.todasProvincias()); //Llenar provincias
                this.cmbZona.SetData(cms.todasZonas()); //Llenar zonas
                this.cmbPropiedad.SetData(cms.todosTipoPropietario()); //Llenar tipo propiedad
                
                Object[] datosSalon = cms.obtenerInformacionSalon(pIntSalon);
                txtNumProyecto.Text = (String)datosSalon[0];
                txtNombre.Text = (String)datosSalon[1];
                if (datosSalon[2] != null) 
                { 
                    txtTelefono.Text = datosSalon[2].ToString();

                }
                cmbProvincia.SelectedKey = datosSalon[3];
                cmbMunicipio.SelectedKey = datosSalon[4];
                cmbZona.SelectedKey = datosSalon[5];
                txtDireccion.Text = (String)datosSalon[6];
                if (datosSalon[7] != null) txtCPostal.Text = (String)datosSalon[7];
                cmbPropiedad.SelectedKey = datosSalon[8];
                if (datosSalon[9] != null) txtCoordenadaAltitud.Text = ((String)datosSalon[9]).Replace(",", ".");
                if (datosSalon[10] != null) txtCoordenadaLatitud.Text = ((String)datosSalon[10]).Replace(",", ".");

                //Llenar congregaciones
                LinkedList<Object[]> lstCongregaciones = (LinkedList<Object[]>)datosSalon[11];
                foreach (Object[] congre in lstCongregaciones)
                    listaAsistentes.Rows.Add(congre);

                LinkedList<Object[]> trazabilidadInspeciones = (LinkedList<Object[]>)datosSalon[12];
                foreach (Object[] lineaInspeccion in trazabilidadInspeciones)
                {
                    listaTrazabilidadInspecciones.Rows.Add(lineaInspeccion);
                    
                    DataGridViewCell cell = listaTrazabilidadInspecciones.Rows[listaTrazabilidadInspecciones.Rows.Count - 1].Cells["DOCUMENTO"];
                    if (lineaInspeccion[3] != null)
                    {
                        cell.Value = "Ver";
                        cell.Tag = lineaInspeccion[3];
                    }
                    else cell.Value = "-";
                }

                LinkedList<Object[]> incidenciasNotificadas = (LinkedList<Object[]>)datosSalon[13];
                foreach (Object[] incidencia in incidenciasNotificadas)
                    listaIncidencias.Rows.Add(incidencia);

                fotosDeSalon1.IDSalon = pIntSalon;
            }
            catch (Exception ex)
            {

                MessageBox.Show(
                    ex.Message,
                    "Error",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error,
                    MessageBoxDefaultButton.Button1
                );
            }

        }

        private void cmbProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbProvincia.SelectedIndex != -1)
            {
                this.cmbMunicipio.SetData(cms.municipiosDeProvincia((int)cmbProvincia.SelectedKey));
            }
        }
        
        protected override void butAlta_Click(object sender, EventArgs e)
        {
            AltaCongregacion altaCongregacion = new AltaCongregacion(this.cms);
            this.panel1.Controls.Add(altaCongregacion);
            altaCongregacion.Dock = DockStyle.Fill;
            altaCongregacion.añadirEscuchadorDeListado(this);
            altaCongregacion.BringToFront();
        }

        protected override void butModificar_Click(object sender, EventArgs e)
        {
            String nCongrSeleccionada = (String)listaAsistentes.SelectedRows[0].Cells["NOMBRE"].Value;
            ModificarCongregacion modificarCongregacion = new ModificarCongregacion(this.cms, nCongrSeleccionada);
            this.panel1.Controls.Add(modificarCongregacion);
            modificarCongregacion.Dock = DockStyle.Fill;
            modificarCongregacion.añadirEscuchadorDeListado(this);
            modificarCongregacion.BringToFront();
        }

        protected override void butEliminar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Estás seguro de querer eliminar la congregación seleccionada?", "Confirmación",
                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                String nCongrSeleccionada = (String)listaAsistentes.SelectedRows[0].Cells["NOMBRE"].Value;
                this.cms.eliminarCongregacion(nCongrSeleccionada);
                listaAsistentes.Rows.Remove(listaAsistentes.SelectedRows[0]);
            }
        }

        private void butKO_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void butOK_Click(object sender, EventArgs e)
        {
            if (txtNumProyecto.Text.Length == 0 ||
                                txtNombre.Text.Trim().Length == 0 ||
                                txtDireccion.Text.Trim().Length == 0 ||
                                cmbZona.SelectedIndex == -1 ||
                                cmbPropiedad.SelectedIndex == -1 ||
                                cmbMunicipio.SelectedIndex == -1)
                        {
                            MessageBox.Show(
                                "Faltan campos obligatorios por cumplimentar",
                                "Advertencia",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Warning,
                                MessageBoxDefaultButton.Button1
                            );
                        }
                        else
                        {
                            int? intMunicipio = null, intProvincia = null, intTelefono = null;

                            if (txtCPostal.Text.Trim().Length > 0 && !txtCPostal.MaskFull)
                            {
                                MessageBox.Show("Código postal incorrecto.", "Advertencia", 
                                    MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1
                                );
                                txtCPostal.Focus();
                                txtCPostal.SelectAll();
                            }
                            else
                            {
                                // post: Sino se ha indicado la congregacion anfitriona -> mostrar mensaje
                                int nAnfittrionas = 0;

                                for (int i = 0; i < listaAsistentes.Rows.Count; i++)
                                {
                                    if ((Boolean)listaAsistentes.Rows[i].Cells["ANFITRIONA"].Value)
                                        nAnfittrionas++;
                                }

                                if (nAnfittrionas != 1)
                                {
                                    MessageBox.Show(
                                        "Indica una, y solo una, congregación anfitriona.",
                                        "Advertencia",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning,
                                        MessageBoxDefaultButton.Button1
                                    );
                                }
                                else
                                {
                                    try
                                    {
                                        if (cmbProvincia.SelectedKey != null) intProvincia = (int)cmbProvincia.SelectedKey;
                                        if (cmbMunicipio.SelectedKey != null) intMunicipio = (int)cmbMunicipio.SelectedKey;
                                        if (!String.IsNullOrEmpty(txtTelefono.Text.Trim())) intTelefono = int.Parse(txtTelefono.Text.Trim().Replace(" ", ""));

                                        //Llamada a controlador dominio
                                        this.cms.modificarSalon(
                                            txtNumProyecto.Text.Trim(),
                                            txtNombre.Text.Trim(),
                                            intProvincia,
                                            intMunicipio,
                                            (int)cmbZona.SelectedKey,
                                            txtDireccion.Text.Trim(),
                                            txtCPostal.Text.Trim(),
                                            txtCoordenadaAltitud.Text.Trim(),
                                            txtCoordenadaLatitud.Text.Trim(),
                                            intTelefono, 
                                            txtObservaciones.Text.Trim(),
                                            (String)cmbPropiedad.SelectedKey
                                         );

                                        

                                        //notificar cambios a escuchadores que contengan una lista de salon
                                        foreach (EscuchadorDeListado esc in base.escuchadoresDeListado)
                                        {
                                            esc.notificarCambio(
                                                this,
                                                "modificar.salon",
                                                new Object[] { 
                                                    intSalon,
                                                    txtNumProyecto.Text.Trim(), 
                                                    txtNombre.Text.Trim(),
                                                    txtTelefono.Text.Trim(), 
                                                    txtDireccion.Text.Trim(), 
                                                    txtCPostal.Text.Trim(), 
                                                    cmbMunicipio.SelectedItem
                                                }
                                            );
                                        }

                                        this.Dispose();
                                    }
                                    catch (ApplicationException AEx) 
                                    {
                                        MessageBox.Show(
                                                AEx.Message, "Advertencia",
                                                MessageBoxButtons.OK, MessageBoxIcon.Warning
                                        );
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show(
                                            ex.Message,"Error",
                                            MessageBoxButtons.OK, MessageBoxIcon.Error
                                        );
                                    }
                                }
                            }
                        }
        }

        #region Miembros de EscuchadorDeListado

        public void notificarCambio(object pSender, string pStrAccion, object pObjValor)
        {
            Object[] valor = (Object[])pObjValor;

            if (pStrAccion.CompareTo("añadir.congregacion") == 0)
            {
                listaAsistentes.Rows.Add(valor);
            }
            else if (pStrAccion.CompareTo("modificar.congregacion") == 0)
            {
                foreach (DataGridViewRow aRow in listaAsistentes.Rows)
                {
                    if (((String)aRow.Cells["NOMBRE"].Value).CompareTo((String)valor[3]) == 0)
                        aRow.SetValues(valor);
                }
            }
            //else if (pStrAccion.CompareTo("notificar.incidencia") == 0) 
            //{
            //    listaIncidencias.Rows.Add(valor);

            //} else if (pStrAccion.CompareTo("modificar.incidencia") == 0)
            //{
            //    foreach (DataGridViewRow aRow in listaIncidencias.Rows)
            //    {
            //        if ( (int)aRow.Cells["ID_INCIDENCIA"].Value == (int)valor[0])
            //            aRow.SetValues(valor);
            //    }
            //}
        }

        #endregion

        private void butVerMapa_Click(object sender, EventArgs e)
        {
            UsrGPS usrGPS = new UsrGPS(intSalon, txtCoordenadaAltitud.Text.Trim(), txtCoordenadaLatitud.Text.Trim());
            //usrGPS.Altitud = txtCoordenadaAltitud.Text;
            //usrGPS.Latitud = txtCoordenadaLatitud.Text;
            usrGPS.StartPosition = FormStartPosition.CenterParent;
            usrGPS.Show();
        }

        void listaTrazabilidadInspecciones_CellClick(object sender, DataGridViewCellEventArgs e)
        {

            if (listaTrazabilidadInspecciones.Columns[e.ColumnIndex].Name.CompareTo("DOCUMENTO") == 0 &&
                listaTrazabilidadInspecciones.Rows[e.RowIndex].Cells["DOCUMENTO"].Tag != null)
            {
                
                int intHoja = (int)listaTrazabilidadInspecciones.Rows[e.RowIndex].Cells["DOCUMENTO"].Tag;
                UsrHojaInspeccion usrHojaInspeccion = new UsrHojaInspeccion(intHoja);
                this.panel1.Controls.Add(usrHojaInspeccion);
                usrHojaInspeccion.BringToFront();
                usrHojaInspeccion.Dock = DockStyle.Fill;
            }
        }

        //private void butNotificarIncidencia_Click(object sender, EventArgs e)
        //{
        //    AbrirIncidencia registrarIncidencia = new AbrirIncidencia(intSalon);
        //    registrarIncidencia.StartPosition = FormStartPosition.CenterParent;
        //    registrarIncidencia.añadirEscuchadorDeListado(this);
        //    registrarIncidencia.ShowDialog();
        //}

        //private void butModificarIncidencia_Click(object sender, EventArgs e)
        //{
        //    int intIncidenciaSeleccionada = (int)listaIncidencias.SelectedRows[0].Cells["ID_INCIDENCIA"].Value;
        //    ModificarIncidencia modificarincidecia = new ModificarIncidencia(intIncidenciaSeleccionada);
        //    modificarincidecia.añadirEscuchadorDeListado(this);
        //    modificarincidecia.ShowDialog();
        //}

        //private void butQuitarIncidencia_Click(object sender, EventArgs e)
        //{
        //    int intIncidenciaSeleccionada = (int)listaIncidencias.SelectedRows[0].Cells["ID_INCIDENCIA"].Value;
        //    if (MessageBox.Show("¿Estás seguro de eliminar esta incidencia?", "Confirmación",
        //        MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
        //        == DialogResult.Yes) 
        //    {
        //        try 
        //        { 
        //            ControladorEliminarIncidencia cEI = new ControladorEliminarIncidencia();
        //            cEI.eliminar(intIncidenciaSeleccionada);
        //            listaIncidencias.Rows.Remove(listaIncidencias.SelectedRows[0]);
        //        }
        //        catch (Exception ex) 
        //        {
        //            MessageBox.Show(
        //                ex.Message, "Error",
        //                MessageBoxButtons.OK, MessageBoxIcon.Error
        //            );
        //        }
        //    }
        //}
    }
}
